Source: US Environmental Protection Agency EJSCREEN Tool, 2020 data (last modified 7/1/21)
EJSCREEN is an “environmental justice (EJ) mapping and screening tool” produced by the EPA.
glimpse(ejscreen)
## Rows: 46
## Columns: 38
## $ ID <chr> "510010901001", "510010901002", "510010901003", "5100109010…
## $ statefips <dbl> 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,…
## $ countyfips <chr> "001", "001", "001", "001", "001", "001", "001", "001", "00…
## $ tractfips <chr> "090100", "090100", "090100", "090100", "090200", "090200",…
## $ blkgpfips <dbl> 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3,…
## $ PRE1960PCT <dbl> 0.34929993, 0.45737855, 0.27187865, 0.17369309, 0.19648094,…
## $ DSLPM <dbl> 0.1902349, 0.1902349, 0.1902349, 0.1902349, 0.1788288, 0.17…
## $ CANCER <dbl> 19.86096, 19.86096, 19.86096, 19.86096, 21.57291, 21.57291,…
## $ RESP <dbl> 0.2342597, 0.2342597, 0.2342597, 0.2342597, 0.2624767, 0.26…
## $ PTRAF <dbl> NA, NA, NA, NA, 143.5144430, 4.9361403, 44.3148087, NA, 74.…
## $ PWDIS <dbl> NA, NA, NA, NA, 1.163455e-04, 9.159836e-03, 2.248991e-03, 1…
## $ PNPL <dbl> 0.01407226, 0.01383525, 0.01368040, 0.01347213, 0.01390480,…
## $ PRMP <dbl> 0.06025332, 0.06554190, 0.06277244, 0.06913822, 0.66536960,…
## $ PTSDF <dbl> 0.09912080, 0.11897784, 0.11237121, 0.13666498, 0.66536960,…
## $ OZONE <dbl> 44.12727, 44.12727, 44.12727, 44.12727, 43.34960, 43.34960,…
## $ PM25 <dbl> 6.863168, 6.863168, 6.863168, 6.863168, 7.010748, 7.010748,…
## $ P_LDPNT <dbl> 66.94467, 74.53987, 60.35342, 49.67612, 52.47047, 36.74985,…
## $ P_DSLPM <dbl> 17.49458, 17.49458, 17.49458, 17.49458, 15.48154, 15.48154,…
## $ P_CANCR <dbl> 6.943091, 6.943091, 6.943091, 6.943091, 11.166566, 11.16656…
## $ P_RESP <dbl> 5.709885, 5.709885, 5.709885, 5.709885, 9.840690, 9.840690,…
## $ P_PTRAF <dbl> NA, NA, NA, NA, 41.997946, 8.993928, 23.495505, NA, 30.5144…
## $ P_PWDIS <dbl> NA, NA, NA, NA, 54.53093, 79.14500, 70.94844, 54.04574, 67.…
## $ P_PNPL <dbl> 10.246804, 9.891942, 9.654256, 9.305683, 9.997929, 10.95281…
## $ P_PRMP <dbl> 6.697439, 7.834296, 7.200346, 8.613989, 66.828961, 29.13652…
## $ P_PTSDF <dbl> 13.633698, 16.354078, 15.479741, 18.672355, 42.786562, 37.9…
## $ P_OZONE <dbl> 63.30248, 63.30248, 63.30248, 63.30248, 54.95983, 54.95983,…
## $ P_PM25 <dbl> 12.16725, 12.16725, 12.16725, 12.16725, 13.61657, 13.61657,…
## $ T_LDPNT <chr> "0.35 = fraction pre-1960 (66%ile)", "0.46 = fraction pre-1…
## $ T_DSLPM <chr> "0.19 ug/m3 (17%ile)", "0.19 ug/m3 (17%ile)", "0.19 ug/m3 (…
## $ T_CANCR <chr> "20 lifetime risk per million (6%ile)", "20 lifetime risk p…
## $ T_RESP <chr> "0.23 (5%ile)", "0.23 (5%ile)", "0.23 (5%ile)", "0.23 (…
## $ T_PTRAF <chr> NA, NA, NA, NA, "140 daily vehicles/meters distance (41%ile…
## $ T_PWDIS <chr> NA, NA, NA, NA, "0.00012 toxicity-weighted concentration/me…
## $ T_PNPL <chr> "0.014 sites/km distance (10%ile)", "0.014 sites/km distanc…
## $ T_PRMP <chr> "0.06 facilities/km distance (6%ile)", "0.066 facilities/km…
## $ T_PTSDF <chr> "0.099 facilities/km distance (13%ile)", "0.12 facilities/k…
## $ T_OZONE <chr> "44.1 ppb (63%ile)", "44.1 ppb (63%ile)", "44.1 ppb (63%ile…
## $ T_PM25 <chr> "6.86 ug/m3 (12%ile)", "6.86 ug/m3 (12%ile)", "6.86 ug/m3 (…
Observations are block group estimates of key environmental indicators:
PRE1960PCT)DSLPM and PM25)CANCER)RESP)PTRAF)PNPL)PRMP)PTSDF)OZONE)PWDIS)P_ indicates percentile ranks for each variable, and T_ indicates map popup text.
ejscreen %>% select(-c(ID:blkgpfips, T_LDPNT:T_PM25)) %>%
select(where(~is.numeric(.x) && !is.na(.x))) %>%
as.data.frame() %>%
stargazer(., type = "text", title = "Summary Statistics", digits = 1,
summary.stat = c("mean", "sd", "min", "median", "max"))
##
## Summary Statistics
## ==========================================
## Statistic Mean St. Dev. Min Median Max
## ------------------------------------------
## PRE1960PCT 0.3 0.2 0.0 0.3 0.7
## DSLPM 0.2 0.01 0.2 0.2 0.2
## CANCER 21.2 0.7 19.9 21.2 22.2
## RESP 0.3 0.01 0.2 0.3 0.3
## PNPL 0.01 0.01 0.0 0.01 0.03
## PRMP 0.2 0.2 0.0 0.1 0.8
## PTSDF 0.2 0.2 0.0 0.1 0.9
## OZONE 44.6 0.6 43.3 44.9 45.5
## PM25 6.9 0.1 6.8 6.9 7.0
## P_LDPNT 58.2 20.0 11.1 60.6 86.3
## P_DSLPM 14.2 1.6 11.5 14.2 17.5
## P_CANCR 10.1 1.7 6.9 10.2 12.8
## P_RESP 9.1 1.7 5.7 9.2 11.9
## P_PNPL 9.9 5.9 0.004 8.8 26.4
## P_PRMP 27.4 20.9 0.004 21.7 71.8
## P_PTSDF 16.3 12.5 0.004 13.3 47.7
## P_OZONE 67.5 5.2 55.0 70.2 73.8
## P_PM25 12.6 0.6 11.7 12.8 13.6
## ------------------------------------------
ejscreen %>% select(ID, PRE1960PCT:PM25) %>%
pivot_longer(-ID, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
scale_fill_viridis(option = "plasma", discrete = TRUE, guide = FALSE) +
geom_histogram() +
facet_wrap(~measure, scales = "free")
meta %>%
filter(varname %in% c("PRE1960PCT", "DSLPM", "CANCER", "RESP", "PTRAF", "PWDIS", "PNPL", "PRMP", "PTSDF", "OZONE", "PM25")) %>%
mutate(label = paste0(varname, ": ", description)) %>%
select(label) %>%
as.list()
## $label
## [1] "PRE1960PCT: Percent of housing built before 1960 -- lead paint indicator"
## [2] "DSLPM: Diesel particulate matter level in the air, measured in micrograms per cubic meter"
## [3] "CANCER: Cancer risk due to toxics in the air"
## [4] "RESP: Ratio of exposure concentration to health-based reference concentration"
## [5] "PTRAF: Average number of daily vehicles at major roads divided by distance in meters"
## [6] "PWDIS: Toxicity-weighted stream concentrations divided by distance in kilometers"
## [7] "PNPL: Number of National Priorities List (NPL) sites within 5 km divided by distance in kilometers"
## [8] "PRMP: Number of Risk Management Plan (RMP) facilities within 5 km divided by distance in kilometers"
## [9] "PTSDF: Number of Treatment Storage and Disposal (TSDF) facilities within 5 km divided by distance in kilometers"
## [10] "OZONE: Summer daily average of ozone concentration in the air, in parts per billion"
## [11] "PM25: Yearly average PM2.5 level in the air, measured in micrograms per cubic meter"
The following figure shows the correlations among primary measures. The darker the color, the more highly correlated a pair of variables are.
ejscreen %>% select(PRE1960PCT:PM25) %>%
ggcorr(label = TRUE, label_alpha = TRUE)
meta %>%
filter(varname %in% c("PRE1960PCT", "DSLPM", "CANCER", "RESP", "PTRAF", "PWDIS", "PNPL", "PRMP", "PTSDF", "OZONE", "PM25")) %>%
mutate(label = paste0(varname, ": ", description)) %>%
select(label) %>%
as.list()
## $label
## [1] "PRE1960PCT: Percent of housing built before 1960 -- lead paint indicator"
## [2] "DSLPM: Diesel particulate matter level in the air, measured in micrograms per cubic meter"
## [3] "CANCER: Cancer risk due to toxics in the air"
## [4] "RESP: Ratio of exposure concentration to health-based reference concentration"
## [5] "PTRAF: Average number of daily vehicles at major roads divided by distance in meters"
## [6] "PWDIS: Toxicity-weighted stream concentrations divided by distance in kilometers"
## [7] "PNPL: Number of National Priorities List (NPL) sites within 5 km divided by distance in kilometers"
## [8] "PRMP: Number of Risk Management Plan (RMP) facilities within 5 km divided by distance in kilometers"
## [9] "PTSDF: Number of Treatment Storage and Disposal (TSDF) facilities within 5 km divided by distance in kilometers"
## [10] "OZONE: Summer daily average of ozone concentration in the air, in parts per billion"
## [11] "PM25: Yearly average PM2.5 level in the air, measured in micrograms per cubic meter"
pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$PTSDF)
leaflet(eastshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = eastshapes,
fillColor = ~pal(PTSDF),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
"Proximity to TSDF: ", eastshapes$T_PTSDF)) %>%
addLegend("bottomright", pal = pal, values = eastshapes$PTSDF,
title = "Proximity to TSDF", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$PTRAF)
leaflet(eastshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = eastshapes,
fillColor = ~pal(PTRAF),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
"Proximity to traffic: ", eastshapes$T_PTRAF)) %>%
addLegend("bottomright", pal = pal, values = eastshapes$PTRAF,
title = "Traffic Proximity", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$PM25)
leaflet(eastshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = eastshapes,
fillColor = ~pal(PM25),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
"PM2.5 Level: ", eastshapes$T_PM25)) %>%
addLegend("bottomright", pal = pal, values = eastshapes$PM25,
title = "PM2.5 Concentrations", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$CANCER)
leaflet(eastshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = eastshapes,
fillColor = ~pal(CANCER),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
"Cancer Risk: ", eastshapes$T_CANCR)) %>%
addLegend("bottomright", pal = pal, values = eastshapes$CANCER,
title = "Air Toxics Cancer Risk", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$DSLPM)
leaflet(eastshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = eastshapes,
fillColor = ~pal(DSLPM),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
"DSLPM: ", eastshapes$T_DSLPM)) %>%
addLegend("bottomright", pal = pal, values = eastshapes$DSLPM,
title = "Diesel Particulate Matter Level", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = eastshapes$OZONE)
leaflet(eastshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = eastshapes,
fillColor = ~pal(OZONE),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("FIPS Code: ", eastshapes$GEOID, "<br>",
"Ozone Level: ", eastshapes$T_OZONE)) %>%
addLegend("bottomright", pal = pal, values = eastshapes$OZONE,
title = "Ozone Levels in the Air", opacity = 0.7)
These scatterplots show the relationship between pairs of EJSCREEN measures.
ejscreen %>%
ggplot() +
geom_point(aes(x=OZONE, y=PM25, color=countyfips)) +
labs(x="Ozone level",
y="PM2.5 level") +
scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))
ejscreen %>%
ggplot() +
geom_point(aes(x=PTRAF, y=CANCER, color=countyfips)) +
labs(x="Proximity to traffic",
y="Cancer risk") +
scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))
ejscreen %>%
ggplot() +
geom_point(aes(x=PTRAF, y=DSLPM, color=countyfips)) +
labs(x="Proximity to traffic",
y="Diesel particulate matter level") +
scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))
ejscreen %>%
ggplot() +
geom_point(aes(x=PM25, y=DSLPM, color=countyfips)) +
labs(x="PM2.5 level",
y="Diesel particulate matter level") +
scale_color_brewer(type = "qual", name = "County", labels = c("Accomack", "Northampton"))
PM2.5, ozone, and NATA indicators (cancer risk, respiratory hazard index, and diesel particulate matter) are measured at the census tract level, so the same value is assigned to each block group within that tract. All other variables were derived for the block group level. Proximity variables (Proximity to Traffic, Major Direct Dischargers to Water, Proximity to NPL Sites, Proximity to RMP Facilities, and Proximity to TSDF Facilities) are also available at the tract level—we calculated a population-weighted for these variables based on the ACS population estimates.